Skip to content
Loafacto 문서/참고 문서/web-ui 문서/13. supabase-set-user-role-rpc.sql

13. supabase-set-user-role-rpc.sql

원본 파일: 'C:\Repository\loafacto-hub\docs\web-ui\13. supabase-set-user-role-rpc.sql'

sql
-- =============================================================================
-- 관리자용: 사용자 역할 변경 RPC (관리자 / 운영자 / 사용자)
-- user_roles 적용 후, Supabase SQL Editor에서 실행하세요.
-- 호출자: super_admin 또는 operator. super_admin으로 설정하려면 호출자가 super_admin이어야 함.
-- p_new_role: 'super_admin' | 'operator' | 'user'. 'user'이면 user_roles 행 삭제(일반 사용자).
-- =============================================================================

CREATE OR REPLACE FUNCTION public.set_user_role(p_target_user_id uuid, p_new_role text)
RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
DECLARE
  v_caller_role text;
BEGIN
  -- 호출자 역할 조회 (super_admin 또는 operator만 허용)
  SELECT role INTO v_caller_role
  FROM public.user_roles
  WHERE user_id = auth.uid()
  LIMIT 1;

  IF v_caller_role IS NULL THEN
    RETURN jsonb_build_object('ok', false, 'error', 'unauthorized');
  END IF;

  IF p_new_role NOT IN ('super_admin', 'operator', 'user') THEN
    RETURN jsonb_build_object('ok', false, 'error', 'invalid_role');
  END IF;

  -- super_admin으로 설정하려면 호출자 본인이 super_admin이어야 함
  IF p_new_role = 'super_admin' AND v_caller_role <> 'super_admin' THEN
    RETURN jsonb_build_object('ok', false, 'error', 'only_super_admin_can_assign');
  END IF;

  IF p_new_role = 'user' THEN
    DELETE FROM public.user_roles WHERE user_id = p_target_user_id;
    RETURN jsonb_build_object('ok', true);
  END IF;

  -- super_admin 또는 operator로 설정: upsert
  INSERT INTO public.user_roles (user_id, role, updated_at)
  VALUES (p_target_user_id, p_new_role, now())
  ON CONFLICT (user_id) DO UPDATE SET
    role = EXCLUDED.role,
    updated_at = EXCLUDED.updated_at;

  RETURN jsonb_build_object('ok', true);
END;
$$;

COMMENT ON FUNCTION public.set_user_role(uuid, text) IS '관리자(super_admin/operator)만 호출. 대상 사용자 역할을 관리자/운영자/사용자로 변경. super_admin 지정은 super_admin만 가능.';

GRANT EXECUTE ON FUNCTION public.set_user_role(uuid, text) TO authenticated;